unit fAprendizadoQ;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses Acao, AcaoGrid, Agente, Ambiente, AmbienteGrid, Estado,
  EstadoGrid, TabelaQ, TabelaQGrid;

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  Robo    : TAgente;
  Grid    : TAmbiente;
  Tabela  : TTabelaQ;

  a       : TAcao;
  s, s2   : TEstado;

  contador : Integer;
  recompensa,
  valorDeTreino : Double;

const
  GERACOES  = 1000;
  DESCONTO  = 0.9;
  N_ESTADOS = 10;
begin

  Grid := TAmbiente.Create(N_ESTADOS);

  Robo := TAgente.Create;

  Tabela := TTabelaQ.Create(Grid, Robo);

  for contador := 0 to GERACOES -1 do
    begin
      s   := Robo.Percebe(Grid);

      a   := Robo.EscolheAcao;

      s2  := Robo.Age(Grid, a);

      recompensa := Grid.Recompensa;

      valorDeTreino := recompensa + DESCONTO * Tabela.RetornaMelhorValor(s);

      Tabela.Treina(s, a, recompensa);


    end;

end;

end.
